#include "gl.hpp"
#include "Mat3.hpp"
#include "Mat4.hpp"
#include "Vec3.hpp"

namespace gl
{
void Translate(const Vec3& aVec)
{
   glTranslatef(aVec[0], aVec[1], aVec[2]);
}
void Multiply(const Mat3& aMat)
{
   float values[16] = { aMat.values[0], aMat.values[1], aMat.values[2], 0,
                        aMat.values[3], aMat.values[4], aMat.values[5], 0,
                        aMat.values[6], aMat.values[7], aMat.values[8], 0,
                        0,              0,              0,              1 };
   glMultMatrixf(values);
}
void Multiply(const Mat4& aMat)
{
   glMultMatrixf(aMat.values);
}
void Vertex(const Vec3& aVec)
{
   glVertex3fv(&aVec.x);
}
void Vertex(const Vec2& aVec)
{
   glVertex2fv(&aVec.x);
}
void Vertex(const Vec2& aVec, float aZ)
{
   glVertex3f(aVec.x, aVec.y, aZ);
}
void Vertex(const std::vector<Vec3>& aVerts)
{
   for (size_t i = 0; i < aVerts.size(); ++i)
   {
      Vertex(aVerts[i]);
   }
}
NoDepthTest::NoDepthTest()
{
   glDisable(GL_DEPTH_TEST);
}
NoDepthTest::~NoDepthTest()
{
   glEnable(GL_DEPTH_TEST);
}
Blend::Blend()
{
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
Blend::~Blend()
{
   glDisable(GL_BLEND);
}
NoLighting::NoLighting()
{
   glDisable(GL_LIGHTING);
}
NoLighting::~NoLighting()
{
   glEnable(GL_LIGHTING);
}
NoCull::NoCull()
{
   glDisable(GL_CULL_FACE);
}
NoCull::~NoCull()
{
   glEnable(GL_CULL_FACE);
}

ZOffset::ZOffset()
{

}

ZOffset::~ZOffset()
{
}

}
